使用 TensorFlow.js 分类文本:检测浏览器中攻击性语言的示例
文 / Jeffrey Sorensen 和 Ann Yuan
为什么要检测毒性?
在线交流平台正逐渐被粗俗或攻击性评论所淹没,这可能导致人们完全放弃讨论。为解决这一问题,Jigsaw 团队和 Google 反滥用技术团队与分享过其评论和审核决策的网站合作,联手创建了 Perspective API。Perspective 采用一些方法(例如,让审查器更快地识别哪些评论可能违反其社区准则),帮助在线社区更好地展开对话。
一些发布商也开发出能够在用户发布评论前向其提供反馈的系统(例如 Coral Talk Plugin)。事实证明,显示预提交消息(例如,评论可能违反社区准则,或者我们会在发布前对评论进行审核)是一种非常有效的做法,可以鼓励用户更仔细地思考如何呈现最终的评论。
注:Coral Talk Plugin 链接
https://docs.coralproject.net/talk/toxic-comments/
毒性分类器示例
在专注于将基于语言的模型引入 TensorFlow.js 的过程中,我们发布了 毒性分类器,并将其作为使用预训练模型检测文本是否包含恶意内容(例如侮辱、威胁、明显含有色情内容的语言等)的开源示例。
注:毒性分类器 链接
https://github.com/tensorflow/tfjs-models/tree/master/toxicity
此模型只是一个示例,您可在此基础上进行构建,但无法直接在生产环境中使用。此外,您还需要对该模型进行额外的精心训练,并针对您所在的网域调优。我们出于教育目的分享此模型,并着重介绍如何构建以接近实时的速度在浏览器中运行且完全客户端的文本分析模型。
此版本是 Jigsaw 的 Perspective API 团队与 Google Brain 的 TensorFlow.js 团队共同合作的成果。此模型大小约为 25MB,在 2018 年推出的 MacBook Pro 上针对每个句子的推理时间约为 30 毫秒。
请注意,这些模型的实验性很强,且相比 Perspective API 上托管的版本,这些 tensorflow.js 版本的准确率较低,意外 ML 偏差较大(您可以查看我们的 模型卡,了解 tensorflow.js 毒性模型,还可在 意外 ML 偏差教程 中查找与此数据集已知问题有关的更多信息)。
注:模型卡 链接
https://github.com/conversationai/perspectiveapi/blob/master/model_cards/English/toxicity-tensorflowjs.md
意外 ML 偏差教程 链接
https://github.com/conversationai/unintended-ml-bias-analysis/blob/master/presentations/FAT_star_tutorial.md
毒性分类器入门指南
安装
您可以立刻开始在项目中使用毒性分类器。第一步是安装模型。您可以通过 NPM 获得此模型:
npm install @tensorflow-models/toxicity
要运行毒性分类器,则需要使用 TensorFlow.js 1.0 版作为对等依赖项,这意味着您需要单独安装 TensorFlow.js 1.0。如果您尚未安装 TensorFlow.js 1.0,则可以运行:
npm install @tensorflow/tfjs@1.0
现在您可以导入毒性模型,方法如下:
import * as toxicity from '@tensorflow-models/toxicity';
您还可以通过网页上的脚本标记添加捆绑模型:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/toxicity"></script>
如此会将 toxicity 公开作为全局变量。
至此,您已安装好模型!
使用
若要开始标记文本,首先要加载模型(提取其权重和拓扑),然后根据需要调整模型设置。
// The minimum prediction confidence.
const threshold = 0.9;
// Which toxicity labels to return.
const labelsToInclude = [‘identity_attack’, ‘insult’, ‘threat’];
toxicity.load(threshold, labelsToInclude).then(model => {
// Now you can use the `model` object to label sentences.
model.classify([‘you suck’]).then(predictions => {...});
});
threshold 参数为最小置信度,若预测数值高于该参数,则认为预测有效(默认值为 0.85)。将 threshold 设置为较高的值意味着预测返回 null 的可能性更高,因为预测值可能小于阈值。
labelsToInclude 参数是一组字符串,指示您希望预测七个毒性标签中的哪一个。这七个标签是:toxicity | severe_toxicity | identity_attack | insult | threat | sexual_explicit | obscene。默认情况下,模型将返回对所有七个标签的预测。
在上面的代码片段中,我们使用 model.classify() API 预测 “you suck”(你烂透了)的毒性。model.classify() 返回一个 Promise,因此我们之后需要调用 .then() 来检索实际的预测结果。
预测结果是一组对象,每个毒性标签匹配一个对象,其中包含每个输入语句的原始概率及最终预测结果。最终预测结果可能是以下三个值中的一个:
如果匹配概率大于置信度阈值,则为 true
如果 *不匹配* 的概率大于置信度阈值,则为 false
如果两个概率均未超过阈值,则为 null
示例文本的预测数组可能如下所示:
[
{
"label": "identity_attack",
"results": [{
"probabilities": [0.965, 0.034],
"match": false
}]
},
{
"label": "insult",
"results": [{
"probabilities": [0.081, 0.919],
"match": true
}]
},
// ...
]
如您所见,每个 results 数组只包含一个项目,这是因为我们的示例输入数组只含有一个句子:[‘you suck’](你烂透了)。但是,我们也可以将输入批量传送到 model.classify() 中,以缩短每个句子的推理时间。虽然传送的最佳句子数取决于每个句子的长度,但在实践中,我们发现批量传送四个句子时的效果很好。
为什么在浏览器中检测毒性?
我们将此示例的发布视为推动这些模型客户端版开发的第一步。客户端模型开辟了更多用例,例如将其用于不公开发布内容的论坛,或者用户更希望在设备上对片段进行评分时。
例如,在客户端开展此类评估可以打消与通过互联网发送尚未发布的评论相关的潜在隐私顾虑。此外,此举还可消除对额外网络服务端点的需求,并允许用户根据任何特定网站的审核策略,完全自定义机器学习模型。
模型详细信息
TensorFlow.js 毒性分类器以 Universal Sentence Encoder 精简版(Cer 等人,2018 年)(USE) 为基础进行构建。Universal Sentence Encoder 精简版是将文本编码为 512 维嵌入的模型(换言之,即由 512 个浮点数组成的列表)。这些嵌入可用作语言处理任务(例如,情感分类和文本相似性分析)的起点。USE 使用 Transformer(Vaswani 等人,2017 年)架构,这是一种使用深度神经网络对语言进行建模的尖端方法。您可以在 TensorFlow Hub 上找到 USE,它也可以作为单独的 TensorFlow.js 模块 使用(https://github.com/tensorflow/tfjs-models/tree/master/universal-sentence-encoder)。
我们还开源了 模型 的训练代码,该模型曾使用从网民评论中选出的数据集 进行训练。我们鼓励您重现我们得出的结果,改进我们的模型,并扩展公开可用的数据集。
注:模型 链接
https://github.com/conversationai/conversationai-models/tree/master/experiments
数据集 链接
https://figshare.com/articles/data_json/7376747
用于构建分类器的代码出现在以 TensorFlow 估算器为基础的另一个 Github 项目中,具体来说,出现在 tf_hub_tfjs 子目录中。您还可以在该子目录中找到此模型相较于以下模型的 性能特性 信息:Perspective API 中使用的模型,以及在 Kaggle 有毒评论挑战赛中创建的模型。这是 USE 模型的简单扩展,在针对每个标签输出结果前只有几个附加层。
注:性能特性 链接
https://github.com/conversationai/conversationai-models/blob/master/experiments/tf_trainer/tf_hub_tfjs/notebook/EvaluatingClassifier.ipynb
如果安装了 TensorFlow.js 转换器,您可使用以下命令(这将只返回 “毒性” 标头)转换已训练的模型,以便在浏览器中使用:
tensorflowjs_converter --input_format=tf_saved_model \
--output_node_names='toxicity/predictions/probabilities' \
--saved_model_tags=serve save_model_dir web_model_dir
注:TensorFlow.js 转换器 链接
https://github.com/tensorflow/tfjs-converter
扩展应用
我们期待看到大家使用客户端机器学习文本模型构建的作品。我们已经开始标记毒性,但是还有许多自然语言数据集可供开发者用来构建新的应用。例如,基于内容的聚类、文本突出显示以及表情符号推荐,这些只是其中一些可能的应用领域,值得您探索一番。
更多 AI 相关阅读: